<html>
  <head></head>
  <body>
    <p>实现一个call方法</p>
    <script>
      Function.prototype.myCall = function(){
        // 获取this上下文，如果为空则为window对象
        let context = Array.from(arguments).shift()
        if(context == null) context = window
        if(typeof context === 'number') context = new Number(context)
        if(typeof context === 'string') context = new String(context)
        if(typeof context === 'boolean') context = new Boolean(context)

        // 在context对象上新增一个方法 即 this方法，并执行
        const fn = Symbol()
        context[fn] = this
        
        const params = Array.from(arguments).slice(1)
        const res = context[fn](...params)

        // 删除原型上的方法
        delete context[fn]

        return res
      }

      let a = {
        name: 'burc',
        fn: function (age) {
          console.log(this, this.name, age)
        },
      }
      
      const context = {name:'vinx'}
      a.fn(18)
      a.fn.call(context,'柏成',18)
      a.fn.myCall(context,'柏成',18)
    </script>
  </body>
</html>
